package cn.lcsjsxy.yxc.multithreading.synchronization;

/**
 * 创建三个c窗口卖票
 * 说明：在继承Thread类创建多线程的方式中，慎用this充当同步监视器，考虑使用当前类充当同步监视
 *
 * 使用synchronized正确包裹之后，仍然出现只有一个线程在输出，将代码交给deepSeek后，
 * 他的解释和我想的差不多，就是Thread-0线程运行太快了，导致其他两个线程根本插不进来
 * 简称：线程饥饿：高频率的锁竞争可能导致某些线程无法获取执行机会。无敌！
 * 使用sleep（）控制节奏后，得已解决
 */
public class WindowTest {
    public static void main(String[] args) {
        Window windowOne = new Window();
        Window windowTwo = new Window();
        Window windowThree = new Window();
        windowOne.start();
        windowTwo.start();
        windowThree.start();
    }
}

class Window extends Thread {
    private static int TICKET = 100;
    static Object obj=new Object();
    @Override
    public void run() {
        while (true) {
//            synchronized (this)  错误的！ this代表着wOne,wTwo,wThree三个对象
            synchronized (obj) {  //Window.class
                if (TICKET > 0) {
                    System.out.println(getName() + ":卖票，票号为：" + TICKET);
                    TICKET--;
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    break;
                }
            }
        }
    }
}
